
#include <unistd.h>
#include <stdint.h>
#include <stdio.h>
 
typedef void (*init_call)(void);
 
extern init_call _init_start;
extern init_call _init_end;
 
#define _init __attribute__((unused, section(".myinit")))
#define DECLARE_INIT(func) init_call _fn_##func _init=func
 
static void A_init(void){
        //write(1, "A_init\n", sizeof("A_init\n"));
	printf("A_init %p\n",A_init);
}
DECLARE_INIT(A_init);
 
static void B_init(void){
        //printf("B_init\n");
	printf("B_init %p\n",B_init);
}
DECLARE_INIT(B_init);
 
static void C_init(void){
        //printf("C_init\n");
	printf("C_init %p\n",C_init);
}
DECLARE_INIT(C_init);
 
void do_initcalls(void){

        init_call *init_ptr = &_init_start;
 
        for(;init_ptr<&_init_end; init_ptr++){
                printf("init address:%p->%p \n", init_ptr,*init_ptr);
                (*init_ptr)();
        }

}
 
int main(void){
        do_initcalls();
        return 0;
}







